package com.lzq.ArrayList;

import com.lzq.ListInterface.List;

public class ArrayList<E> implements List<E> {
    //定义ArrayList的初始容量大小
    private static int DEFAULT_CAPACITY = 2;
    //定义实际储存了多少
    private int size;
    //定义储存的数组
    private Object[] elementData;

    //无参构造函数，数组默认初始化长度为10
    public ArrayList() {
        elementData = new Object[10];
    }
    //有参构造函数，可以定义数组的大小
    public ArrayList(int length) {
        elementData = new Object[length];
    }

    //获取实际储存内容的大小
    public int size() {
        return size;
    }

    //判断数组实际储存内容是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    //往数组中添加内容
    public void add(E e) {
        //验证数组是否已经满了,如果满了那么就扩容
        if((size + 1) >elementData.length){
            int oldLength = elementData.length;
            int newLength = oldLength * 2;
            Object[] elementDate_temp = new Object[newLength];
            //把数据复制到临时数组
            for(int i = 0; i < oldLength; i++){
                elementDate_temp[i] = elementData[i];
            }
            elementData = elementDate_temp;
        }
        //把内容放到数组，并且size+1
        elementData[size++] = e;
    }

    //取数据
    public E get(int index) {
        if(index < 0 || index >= elementData.length){
            throw new RuntimeException("索引不合法！！！！");
        }
        return (E)elementData[index];
    }

    //删除元素
    public boolean remove(int index) {
        //验证索引是否合法
        if(index < 0 || index >= size){
            throw new RuntimeException("索引不合法！！！！");
        }
        //把改元素置空如果size == elementData.length && index ==size - 1 那么最后一个元素不能被他后面的元素覆盖
        elementData[index] = null;
        //数组元素逐个往前移动
        for(int i = (index + 1); i < size; i ++){
            elementData[i - 1] = elementData[i];
        }
        size --;
        return true;
    }

}
